package StackPractice;

import java.util.Stack;

public class IsValid {
    /**
     * 有效的括号
     * 给定一个只包括 '('，')'，'{'，'}'，'['，']'的字符串 s ，判断字符串是否有效。
     * <p>
     * 有效字符串需满足：
     * <p>
     * 左括号必须用相同类型的右括号闭合。
     * 左括号必须以正确的顺序闭合。
     * <p>
     * 示例 1：
     * <p>
     * 输入：s = "()"
     * 输出：true
     * 示例2：
     * <p>
     * 输入：s = "()[]{}"
     * 输出：true
     * 示例3：
     * <p>
     * 输入：s = "(]"
     * 输出：false
     * 示例4：
     * <p>
     * 输入：s = "([)]"
     * 输出：false
     * 示例5：
     * <p>
     * 输入：s = "{[{}]}"
     * 输出：true
     *
     * @param s
     * @return
     */
    public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        int length = s.length();
        for (int i = 0; i < length; i++) {
            char charAt = s.charAt(i);
            if (charAt == '{' || charAt == '[' || charAt == '(') {
                stack.push(charAt);
            } else {
                if (stack.isEmpty() || charAt == '}' && stack.peek().charValue() != '{'
                        || charAt == ']' && stack.peek().charValue() != '[' || charAt == ')' && stack.peek().charValue() != '(') {
                    return false;
                }
                stack.pop();
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String s = "({{{{}}}))";
        boolean valid = isValid(s);
        System.out.println(valid);
    }
}
